﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace StudyIO
{
    public partial class frmDirectory : Form
    {
        public frmDirectory()
        {
            InitializeComponent();

            Init();
        }
        /// <summary>
        /// 初始化树图的根节点
        /// </summary>
        void Init()
        {
            DriveInfo[] drives = DriveInfo.GetDrives();
            foreach (var item in drives)
            {
                if (item.IsReady)
                {
                    AddRootNode(item.Name);
                }
            }
        }

        /// <summary>
        /// 实例化树图的根节点并添加到treeview上
        /// </summary>
        /// <param name="name"></param>
        void AddRootNode(string name)
        {
            TreeNode rootNode = new TreeNode()
            {
                Text = name,
                Tag = name,
                //添加节点的照片
                ImageIndex = 0,
                //被选中的时候的照片，如果不设置此属性只是设置了 【ImageIndex】属性的话就会有一些小bug
                SelectedImageIndex = 0

            };
            this.tvDirectory.Nodes.Add(rootNode);
        }

        /// <summary>
        /// 实例化文件夹节点并且添加到指定的节点下面
        /// </summary>
        /// <param name="parent"></param>
        /// <param name="name"></param>
        void AddFolderNode(TreeNode parent, string name)
        {
            TreeNode rootNode = new TreeNode()
            {
                Text = Path.GetFileName(name),
                Tag = name,
                //添加节点的照片
                ImageIndex = 1,
                //被选中的时候的照片，如果不设置此属性只是设置了 【ImageIndex】属性的话就会有一些小bug
                SelectedImageIndex = 1
            };
            parent.Nodes.Add(rootNode);
        }

        /// <summary>
        /// 实例化文件节点并添加到指定的节点下
        /// </summary>
        /// <param name="parent"></param>
        /// <param name="name"></param>
        void AddFileNode(TreeNode parent, string name)
        {
            TreeNode rootNode = new TreeNode()
            {
                Text = Path.GetFileName(name),
                Tag = name,
                //添加节点的照片
                ImageIndex = 2,
                //被选中的时候的照片，如果不设置此属性只是设置了 【ImageIndex】属性的话就会有一些小bug
                SelectedImageIndex = 2
            };
            parent.Nodes.Add(rootNode);
        }

        /// <summary>
        /// 点击节点时出发的事件
        /// <p>当点击节点的时候才加载位于该节点下面的节点，是一种简单的延迟加载机制</p>
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void tvDirectory_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
        {
            if (e.Button != MouseButtons.Left)
            {
                return;
            }

            try
            {
                //清空选中节点下的所有节点下的节点
                e.Node.Nodes.Clear();

                string directory = e.Node.Tag.ToString();
                string[] directorys = Directory.GetDirectories(directory);
                //先加载文件夹
                foreach (var item in directorys)
                {
                    this.AddFolderNode(e.Node, item);
                }
                //加载文件
                string[] files = Directory.GetFiles(directory);
                foreach (string item in files)
                {
                    this.AddFileNode(e.Node, item);
                }
                //判断节点是否展开了如果没有展开那么就展开节点
                if (!e.Node.IsExpanded)
                    e.Node.Expand();
                //如果树图节点是展开的那么久关闭节点
                else
                    e.Node.Collapse();
            }
            catch (Exception)
            {
                Console.WriteLine("权限问题报错!");
            }

        }
    }
}
